"""
引用 介绍
    概述：
        Python中的引用，指的是 地址值，即：变量在内存中的位置(地址)
    查看地址：
        id(变量名)  可以查看变量在内存中存储的地址
        hex(十进制) 将十进制转换成16进制

    细节：
        1. Python中 只有 引用传递 即： 我们前面看到的所有的赋值行为，都是把地址拷贝过去的
        2. 区分 可变 和 不可变类型的依据， 在不改变地址的情况下，是否可以改变变量的内容，
            可以：可变类型
            不可以：不可变类型
        3. 观察如下的代码，分析程序结果

"""

s = '刘千琪'


s2 = s
a = 18

print(id(s))
print(id(a))


def get_sum(*args):
    return sum(args)

print(get_sum) # 0x0000000000FCC680
print(id(get_sum)) # 17548928
print(hex(id(get_sum))) # hex() 将十进制转换成16进制

# 地址发生了改变，证明str不可变
s = 'ABC'
print(id(s))
s = 'ABCD'
print(id(s))
print('=' * 30)

a = 10
b = a
c = a
print(id(a)) # 地址都一样，说明值的传递传递的是地址
print(id(b))
print(id(c))

print('=' * 30)
# 演示 可变和不可变
list1 = [1,2,3]
print(f'list1修改之前的元素值:{list1}')
print(f'list1修改之前的地址:{id(list1)}')

list1.append(4)
print(f'list1修改之后的元素值:{list1}')
print(f'list1修改之后的地址:{id(list1)}')

print('=' * 30)

s1 = 'abc'
print(f's1修改之前的元素值:{s1}')
print(f's1修改之前的地址:{id(s1)}')

s1 = 'abc' + 'd'
print(f's1修改之后的元素值:{s1}')
print(f's1修改之后的地址:{id(s1)}')

